package nusar

import groovy.sql.Sql

class AlumnoController {

	def beforeInterceptor = [action:this.&autenticar]
	static defaultAction = "principal"

	
	def autenticar(){
	
		// Si la sesion no se ha creado
		if(!session.user)
		{
			// Se regresa a la pantalla de login
			redirect(controller: "usuario", action:"login")
		}
	}
	
	
	// Boton Salir, Vista Principal
	def logout(){
		
		// Se invalida la sesion
		session.user = null
		
		// Se regresa a la pantalla de login
		redirect(controller: "usuario", action:"login")
	}
	
	
	def principal(){
		
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user)
			return
			
		// Informaion general del alumno
		def infoAlumno = session.user.infoAlumno
		
		// Obtener las materias que cursa el alumno con sus horarios (Carga academica)
		def horarioAlumno = session.user.materias
		
		// Obtenemos la solicitud del alumno
		def solicitud = Solicitud.findByAlumno(Alumno.get(session.user.infoAlumno.matricula))
		
		// Si la solicitud ya se creo y esta en estado de Borrador, valor = display:none
		// En caso contrario, valor = ""
		String botonAceptar
		/*
		if(solicitud.estado.equalsIgnoreCase("Borrador")){
			botonAceptar="display:none";
		}
		else{
			botonAceptar="";
		}
		*/
		
		// Si el estado de la solicitud esta en Pendiente, valor = display:none
		// En caso contrario, valor = ""
		String mensajePendiente
		
		if(!solicitud || solicitud.estado.equalsIgnoreCase("Pendiente") || solicitud.estado.equalsIgnoreCase("Revisada")){
			mensajePendiente="display:none";
		}
		else{
			mensajePendiente="";
		}
		
		[infoAlumno: infoAlumno, 
		 horarioAlumno: horarioAlumno, 
		 solicitud: solicitud, 
		 botonAceptar: botonAceptar,
		 mensajePendiente: mensajePendiente]
	}
	
	
	
	
	def crearSolicitud(){
		
		// No intentar obtener informacion si la sesion no esta creada
		if(!session.user)
			return
			
		// Informacion sobre todas las materias disponibles y sus horarios (no cursadas por alumno)
		def materias_horario = UABCService.getAllMaterias()
	

		// Obtener las materias que cursa el alumno con sus horarios (Carga academica)
		HashMap horarioAlumno = session.user.materias
		
		
		if(materias_horario)
		{
			// Quitar las materias que esta cursando el alumno
			for (Object key : horarioAlumno.keySet())
			{
				materias_horario.remove(key)
			}
			
			// Quitar las materias que ya curso el alumno
			for(Object key: session.user.cardex.keySet())
			{
				materias_horario.remove(key)
			}
		}
		
		// Obtenemos las solicitudes del alumno(maximo deben ser 2)
		def solicitudes = Solicitud.findAllByAlumno(Alumno.get(session.user.infoAlumno.matricula))
		
		if( solicitudes)
		{
			for(Solicitud solicitud : solicitudes)
			{
				// Si ya tenemos materias en la solicitud, esas tampoco se deben de mostrar
				if(solicitud.peticiones.size() > 0)
				{
					for(Solicitud_Materias peticion : solicitud.peticiones)
					{
						if(peticion.tipo.equalsIgnoreCase("Baja"))		
							horarioAlumno.remove(""+peticion.materia.iden)
						else
							materias_horario.remove(""+peticion.materia.iden)
					}
				}
			}
		}
		
		
		def mostrarBoton = ""
		def solicitud = Solicitud.findByAlumnoAndEstado(Alumno.get(session.user.infoAlumno.matricula), "Pendiente")
		
		// Si la solicitud esta en estado de pendiente,
		// o si ya no hay materias para dar de alta o baja, valor = display:none
		// En caso contrario, valor = ""
		if((solicitud)
		|| (horarioAlumno.size() == 0 && materias_horario.size() == 0))
			mostrarBoton = "display:none"
		
		[materias_horario: materias_horario,
		 horarioAlumno: horarioAlumno,
		 mostrarBoton: mostrarBoton]

		
		
	}

	
	
	def guardarMaterias(){
		
		// Parametros: Los ids de las materias se obtienen de crearSolicitud.gsp
		def idMateriasAltas = []
		def idMateriasBajas = []
		
		
		idMateriasAltas=params.altas_checkbox
		idMateriasBajas=params.bajas_checkbox
		
		println idMateriasAltas
		println idMateriasBajas
		
		def alumno = Alumno.get(session.user.infoAlumno.matricula)
		
		def solicitud = Solicitud.findByEstadoInList(["Pendiente", "Borrador"])
		
		// Verificar que el alumno no haya enviado dos solicitudes
		if(alumno.solicitudesEnviadas < 2)
		{
			  // Numero de solicitudes
			  def numSolicitudes = alumno.solicitudes.size()
			  
			  // Si no esta registrada la solicitud en la BD, crear una con estado de "Borrador"
			  if(numSolicitudes == 0 || (numSolicitudes == 1 && !solicitud) )
			  {
				   // Ejemplo de alta de solicitud, EZB
				 solicitud = new Solicitud(estado: "Borrador",
											 alumno: alumno,
											  coordinador: Coordinador.findByNumTrabajador(session.user.infoAlumno.coordinador.id),
											  fechaEnvio:  (new Date()),
											  estatus: session.user.infoAlumno.estatus,
											  periodo: "2012-2")
				   
				 // Guardamos la solicitud y checamos si hubo errores
				 if( !solicitud.save(flush:true) )
				 {
					  solicitud.errors.each {
						   println it
					  }
				}
			  }
		//	  else
		//		  solicitud = Solicitud.findByAlumnoAndEstado(alumno, "Borrador")
				  
			// Si la solicitud es nula, debe haber una en estado de Pendiente
		//	if(!solicitud)
		//		solicitud = Solicitud.findByAlumnoAndEstado(alumno, "Pendiente")
				  
			// Verificar que no se cuente con una solicitud en estado Pendiente
			// En este caso, ya no se puede modificar la solicitud
			if(!solicitud.estado.equalsIgnoreCase("Pendiente"))
			{
				  // Verificar que haya al menos una materia seleccionada
				  if( (idMateriasAltas && idMateriasAltas.size() > 0) || (idMateriasBajas && idMateriasBajas.size() > 0) )
				  {
										   
					// Verificar que (Materias Cursadas + Altas - Bajas <= 8)
					int materiasActuales = session.user.materias.size()
					int altas = idMateriasAltas==null ? 0 : idMateriasAltas.size()
					int bajas = idMateriasBajas==null ? 0 : idMateriasBajas.size()
					
					if( (materiasActuales+altas-bajas) <= 8)
					{
						// Alta de Materias
						for(def id : idMateriasAltas)
						  {
							// En caso de ser alta:
							// Verificar que el alumno no este cursando una materia con el mismo nombre (PENDIENTE)
							  // Checar que la materia no se traslape con el horario del alumno (PENDIENTE)
					  
							  // Guardar las materias en la tabla Solicitud_Materias con el estado de "Pendiente"
							  def peticion = new Solicitud_Materias( solicitud: solicitud,
																	 tipo: "Alta",
																	 estado: "Pendiente",
																	 materia: Materia.get(id))
							  
							  // Incrementar la demanda
							  Materia.get(id).demanda++
		  
							if( !peticion.save(flush:true) )
							{
								 peticion.errors.each {
									  println it
								 }
							}
						  }
						  
						  // Baja de Materias
						  for(def id : idMateriasBajas)
						  {
							  // Guardar las materias en la tabla Solicitud_Materias con el estado de "Pendiente"
							  def peticion = new Solicitud_Materias( solicitud: solicitud,
																	 tipo: "Baja",
																	 estado: "Pendiente",
																	 materia: Materia.get(id))
			
							  if( !peticion.save(flush:true) )
							  {
								   peticion.errors.each {
										println it
								   }
							  }
						  }
				}
				else
				{
					flash.message = "Tu total de materias es mayor a 8, esto no esta permitido."
				}
								
					  }
					  else
					  {
						  flash.message = "No seleccionaste ninguna materia."
					  }
			 }
			 else
			 {
				 flash.message = "Ya has enviado una solicitud que esta en espera de ser revisada."
			 }
		}
		else
		{
			flash.message = "Ya no es posible enviar otra solicitud."
		}

		// Regresar a la pantalla principal
		redirect(action: "principal")
		
	}
	
	//def aceptarSolicitud(){			
		// Mostrar pop-up de confirmacion de solicitud
	//}
	 
	def confirmarSolicitud(){			
			
		def alumno = Alumno.get(session.user.infoAlumno.matricula)	
		
		// Se incrementa el numero de solicitudes enviadas por el alumno (Alumno.solicitudesEnviadas)
		alumno.solicitudesEnviadas++
		if(!alumno.save(flush:true)){
			alumno.errors.each {
				println it
			}
		}
		
		def solicitud=Solicitud.findByAlumnoAndEstado(alumno, "Borrador")
		
		println solicitud
		
		// Se cambia el estado de la solicitud a "Pendiente"
		solicitud.estado="Pendiente"
		if(!solicitud.save(flush:true)){
			solicitud.errors.each {
				println it
			}
		}
			
		redirect(action:"principal")				
	}
	
	
	def eliminarMateriaSolicitud(){
		
		// Obtenemos la peticion
		def peticion = Solicitud_Materias.get(params.id)
		
		// Si es una solicitud de Alta, decrementamos su demanda
		if(peticion.tipo.equalsIgnoreCase("Alta"))
			peticion.materia.demanda--;
			
		// Eliminamos la peticion
		peticion.delete(flush: true);
		
		def solicitud = Solicitud.findByAlumnoAndEstado(Alumno.get(194347), "Borrador")
		
		// Eliminamos las dependencias
		solicitud.peticiones.remove(peticion)
		
		render(template: "listS", model : [solicitud:solicitud])
		
	}
	
}
